// Product.java
package com.estore.model;

import java.io.Serial;
import java.util.Objects;
import java.util.Set;
import java.util.HashSet;
import java.io.Serializable;

/**
 * 商品实体类
 * 用于表示电商平台中的商品信息，包括商品ID、名称、价格和库存等属性。
 * 实现了Comparable接口，支持按照商品ID进行排序。
 */
public class Product implements Comparable<Product>, Serializable {
    @Serial
    private static final long serialVersionUID = 1L;

    private String id;      // 商品ID
    private String name;    // 商品名称
    private double price;   // 价格
    private int stock;      // 库存
    private Set<String> tags; // 商品标签

    /**
     * 构造方法，初始化商品对象的所有属性
     *
     * @param id     商品唯一标识符
     * @param name   商品名称
     * @param price  商品价格
     * @param stock  商品库存数量
     */
    public Product(String id, String name, double price, int stock) {
        this(id, name, price, stock, new HashSet<>());
    }

    /**
     * 构造方法，初始化商品对象的所有属性，包括标签
     *
     * @param id     商品唯一标识符
     * @param name   商品名称
     * @param price  商品价格
     * @param stock  商品库存数量
     * @param tags   商品标签集合
     */
   public Product(String id, String name, double price, int stock, Set<String> tags) {
    this.id = id;
    this.name = name;
    this.price = price;
    this.stock = stock;
    // 确保 tags 集合不为 null
    this.tags = tags != null ? new HashSet<>(tags) : new HashSet<>();
}


    // Getters and Setters ...
    /**
     * 获取商品ID
     *
     * @return 商品ID字符串
     */
    public String getId() { return id; }

    /**
     * 设置商品ID
     *
     * @param id 商品ID字符串
     */
    public void setId(String id) { this.id = id; }

    /**
     * 获取商品名称
     *
     * @return 商品名称字符串
     */
    public String getName() { return name; }

    /**
     * 设置商品名称
     *
     * @param name 商品名称字符串
     */
    public void setName(String name) { this.name = name; }

    /**
     * 获取商品价格
     *
     * @return 商品价格（double类型）
     */
    public double getPrice() { return price; }

    /**
     * 设置商品价格
     *
     * @param price 商品价格
     */
    public void setPrice(double price) { this.price = price; }

    /**
     * 获取商品库存数量
     *
     * @return 商品库存数量
     */
    public int getStock() { return stock; }

    /**
     * 设置商品库存数量
     *
     * @param stock 商品库存数量
     */
    public void setStock(int stock) { this.stock = stock; }

    /**
     * 获取商品标签集合
     *
     * @return 商品标签集合的一个副本
     */
    public Set<String> getTags() {
        return tags;
    }


    /**
     * 设置商品标签集合
     *
     * @param tags 商品标签集合
     */
    public void setTags(Set<String> tags) {
        this.tags = tags;
    }

    /**
     * 返回商品对象的字符串表示形式
     * 格式化输出商品的关键信息，便于调试和展示
     *
     * @return 包含商品ID、名称、价格、库存和标签的格式化字符串
     */
    @Override
    public String toString() {
        String baseInfo = String.format("ID: %-5s | 名称: %-20s | 价格: ¥%-8.2f | 库存: %d", id, name, price, stock);
        if (tags != null && !tags.isEmpty()) {
            return String.format("%s | 标签: %s", baseInfo, tags);
        } else {
            return baseInfo;
        }
    }

    // 重写 equals 和 hashCode 是一个好习惯，特别是当对象要放入Set或作为Map的key时
    /**
     * 判断当前商品对象是否与另一个对象相等
     * 两个商品对象相等的条件是它们的商品ID相同
     *
     * @param o 要比较的对象
     * @return 如果对象相等返回true，否则返回false
     */
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Product product = (Product) o;
        return Objects.equals(id, product.id);
    }

    /**
     * 计算并返回当前商品对象的哈希码值
     * 基于商品ID计算哈希码，确保相等的对象具有相同的哈希码
     *
     * @return 商品对象的哈希码值
     */
    @Override
    public int hashCode() {
        return Objects.hash(id);
    }

    /**
     * 按照商品ID对商品对象进行比较
     * 实现Comparable接口的方法，用于商品对象的排序
     *
     * @param other 要比较的另一个商品对象
     * @return 比较结果：负数表示当前对象小于other，0表示相等，正数表示大于other
     */
    @Override
    public int compareTo(Product other) {
        return this.id.compareTo(other.id);
    }

    /**
     * 获取商品类别（预留方法）
     * 注意：目前尚未实现具体逻辑，请根据实际业务补充。
     *
     * @return 空字符串（默认值）
     */
    public String getCategory() {
        return "";
    }
}
